From ba6c27de2bcc9635f98ad4492440b7f260d8b484 Mon Sep 17 00:00:00 2001 From: tsteven4 Date: Tue, 20 Aug 2013 12:10:43 +0000 Subject: [PATCH] correct error in computing time spans related to DST. add toMSecsSinceEpoch() for Qt versions before 4.7. --- gpsbabel/src/core/datetime.h | 15 ++++++++++++--- gpsbabel/waypt.cc | 6 +++--- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/gpsbabel/src/core/datetime.h b/gpsbabel/src/core/datetime.h index c2d8fdb98..1673aa6c9 100644 --- a/gpsbabel/src/core/datetime.h +++ b/gpsbabel/src/core/datetime.h @@ -23,6 +23,7 @@ #include +#include #include // As this code began in C, we have several hundred places that set and @@ -79,12 +80,20 @@ public: // Qt 4.6 and under doesn't have msecsTo. Fortunately, it's easy to // provide. It's a 64-bit because if the times aren't on the same day, // the returned value can be quite large. - int64_t msecsTo(const QDateTime &dt) { - qint64 days = daysTo(dt); - qint64 msecs = time().msecsTo(dt.time()); + qint64 msecsTo(const QDateTime &dt) const { + QDateTime dtutc = dt.toUTC(); + QDateTime thisutc = toUTC(); + qint64 days = thisutc.daysTo(dtutc); + qint64 msecs = thisutc.time().msecsTo(dtutc.time()); return days * (1000 * 3600 * 24) + msecs; } + // Qt 4.6 and under doesn't have toMSecsSinceEpoch. + qint64 toMSecsSinceEpoch() const { + QDateTime epoch = QDateTime(QDate(1970, 1, 1), QTime(0, 0, 0, 0), Qt::UTC); + return -msecsTo(epoch); + } + // Like toString, but with subsecond time that's included only when // the trailing digits aren't .000. Always UTC. QString toPrettyString() const { diff --git a/gpsbabel/waypt.cc b/gpsbabel/waypt.cc index 22f0e4f26..70e728661 100644 --- a/gpsbabel/waypt.cc +++ b/gpsbabel/waypt.cc @@ -546,7 +546,7 @@ waypt_time(const waypoint* wpt) if (!wpt->creation_time.isValid()) { return (double) 0; } else { - return (double)wpt->creation_time.toTime_t(); + return ((double)wpt->creation_time.toMSecsSinceEpoch()) / 1000.0; } } @@ -609,7 +609,7 @@ waypt_speed_ex(const waypoint* A, const waypoint* B) return 0; } - time = fabs(waypt_time(A) - waypt_time(B)); + time = fabs(A->creation_time.msecsTo(B->creation_time)) / 1000.0; if (time > 0) { return (dist / time); } else { @@ -632,7 +632,7 @@ waypt_speed(const waypoint* A, const waypoint* B) return 0; } - time = fabs(waypt_time(A) - waypt_time(B)); + time = fabs(A->creation_time.msecsTo(B->creation_time)) / 1000.0; if (time > 0) { return (dist / time); } else { -- 2.30.2